home *** CD-ROM | disk | FTP | other *** search
- PAGE ,132
- TITLE Sine computation
- IF1
- INCLUDE 87MAC.LIB
- ENDIF
- STACK SEGMENT STACK
- DW 64 DUP(?)
- STACK ENDS
- CODE SEGMENT PUBLIC
- ASSUME CS:CODE,DS:CODE,ES:CODE
- EXTRN FLOAT_ASCII:NEAR
- NUM_ANGLE DW 1
- DEN_ANGLE DW 2
- STATUS DW ?
- FOUR DW 4
- ten6 dd 1000000
- C3 EQU 40H
- C2 EQU 04H
- C1 EQU 02H
- C0 EQU 01H
- ERROR_MSG DB 'Angle is too large',10,13,'$'
- SIN PROC FAR
- PUSH DS
- SUB AX,AX
- PUSH AX
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- DO_AGAIN:
- FINIT ;------ST0------;-----ST1-------
- FILD NUM_ANGLE ; ;
- FIDIV DEN_ANGLE ; X= ANGLE ;
- FLDPI ; PI ; X
- FIDIV FOUR ; PI/4 ; X
- FXCH ; X ; PI/4
- FPREM ; R ; PI/4
- FSTSW STATUS
- FWAIT
- MOV AH,BYTE PTR STATUS+1
- TEST AH,C2
- JNZ BIG_ANGLE
- TEST AH,C1 ; Determine if pi/4 subtract needed
- JZ DO_R ; If zero, then no subtract
- FSUBRP ST1,ST0 ; A=PI/4-R ; ?
- JMP SHORT DO_FPTAN
- DO_R:
- FXCH ; PI/4 ; R
- FCOMP ; R ; ?
- DO_FPTAN:
- FPTAN ; OPP ; ADJ where OPP/ADJ=TAN(A)
-
- ;------ Determine if sin or cos required
-
- TEST AH,C3 OR C1 ; Look at both
- JPE DO_SINE
- FXCH ; ADJ ; OPP
- DO_SINE: ; D ; N
-
- ;------ Calculate N/SQR(N**2 + D**2)
-
- FMUL ST0 ; D**2 ; N
- FXCH ST1 ; N ; D**2
- FLD ST0 ; N ; N ; D**2
- FMUL ST0 ; N**2 ; N ; D**2
- FADD ST2 ; N**2+D**2 ; N ; D**2
- FSQRT ;SQR(N2+D2) ; N ; D**2
- FDIVRP ST1 ; SIN(X) ; D**2
- FXCH ST1 ; D**2 ; SIN(X) ;
- FCOMP ; SIN(X)
- TEST AH,C0
- JZ SIGN_OK
- FCHS
- SIGN_OK:
- CALL FLOAT_ASCII
- INC NUM_ANGLE
- CMP NUM_ANGLE,13
- JA RETURN_INST
- JMP DO_AGAIN
- RETURN_INST:
- RET
- BIG_ANGLE:
- MOV DX,OFFSET ERROR_MSG
- MOV AH,9
- INT 21H
- RET
- org 200h
- bcd_temp dt ?
- org 210h
- fimul ten6
- fbstp bcd_temp
- int 3
- SIN ENDP
- CODE ENDS
- END SIN
-